import os
import csv
import hashlib
import argparse

def calculate_md5(file_path):
    """计算文件的 MD5 哈希值"""
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

def process_and_save_file_info(directory, csv_file, log_dir):
    """处理文件信息并逐行写入 CSV 文件"""
    # 创建日志目录
    os.makedirs(log_dir, exist_ok=True)

    # 打开 CSV 文件准备写入
    with open(csv_file, mode='w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        # 写入表头
        writer.writerow(['File Name', 'Absolute Path', 'File Extension', 'File Size (bytes)', 'MD5 Hash'])

        # 遍历目录下的所有文件
        for root, dirs, files in os.walk(directory):
            # 为当前文件夹创建日志文件
            folder_log_file = os.path.join(log_dir, f"{os.path.basename(root)}.log")
            with open(folder_log_file, "w", encoding='utf-8') as logfile:
                logfile.write(f"Processing folder: {root}\n")
                for file in files:
                    file_path = os.path.join(root, file)
                    file_size = os.path.getsize(file_path)
                    file_md5 = calculate_md5(file_path)
                    # 提取文件扩展名，如果没有扩展名则使用 '--'
                    file_name, file_extension = os.path.splitext(file)
                    file_extension = file_extension[1:] if file_extension else '--'

                    # 写入一条文件信息到 CSV
                    writer.writerow([file, file_path, file_extension, file_size, file_md5])
                    # 在处理完文件后记录日志
                    logfile.write(f"Processed and saved: {file_path}\n")
                    print(f"Processed and saved: {file_path}")

if __name__ == "__main__":
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(description='遍历目录并将文件信息逐行输出到CSV文件中')
    parser.add_argument('directory', type=str, help='要遍历的目录路径')
    parser.add_argument('csv_file', type=str, help='输出的CSV文件路径')
    parser.add_argument('log_dir', type=str, help='日志文件输出目录')

    # 解析命令行参数
    args = parser.parse_args()

    # 调用函数
    process_and_save_file_info(args.directory, args.csv_file, args.log_dir)